﻿using System;
using Google.Translates.WebService.Properties;
using Google.Translates.WebService.TranslateParmas;

namespace Google.Translates.WebService.Entities
{
    /// <summary>
    /// The Task
    /// Some properties's value of this object will save in GoogleTranslateEngine's Database.
    /// 這是一個Database腳本運行任務物件
    /// 其中一部分的屬性需要映射到Database
    /// </summary>
    public class DbExecTask
    {
        /// <summary>
        /// 初始化物件部分屬性的預設值
        /// </summary>
        /// <param name="inputParma">Target Databaes Information</param>
        private void InitInfo(DbUpdateParma inputParma)
        {
            //邏輯還未編寫完成--------------
            var sourceLanguageCode = inputParma.SourceLanguageCode;
            m_IsAutoCheckTheSourceLanguage = string.IsNullOrEmpty(sourceLanguageCode);
            SourceLanguageCode = sourceLanguageCode;
            TargetLanguageCode = inputParma.TargetLanguageCode;
            SourceText = inputParma.SourceText;
            DbAlias = inputParma.DbAlias;
            CreateDate = DateTime.Now;
            TranslateErrorMessage = ExecSqlErrorMessage = "";
            TranslateTimeout = Settings.Default.Default_DbUpdate_TranslateTimeout;
            RunTimesLimit = Settings.Default.Default_DbUpdate_RunTimesLimit;
            RunTimesAmount = 0;
            DbExecSqlTimeout = Settings.Default.Default_DbUpdate_ExecSqlTimeout;

        }


        public DbExecTask(DbUpdateParma inputParma)
        {
            InitInfo(inputParma);
        }

        /// <summary>
        /// The Unique column of the DataRow in Database
        /// 資料記錄的唯一標識
        /// 當前屬性會映射到Database
        /// </summary>
        public Guid Id { get; set; }
        /// <summary>
        /// 需要進行 Translate 的文字段落
        /// 當前屬性會映射到Database
        /// </summary>
        public string SourceText { get; set; }

        protected bool m_IsAutoCheckTheSourceLanguage;

        /// <summary>
        /// 是否進行來源語言的自動檢測
        /// </summary>
        public bool IsAutoCheckTheSourceLanguage
        {
            get { return m_IsAutoCheckTheSourceLanguage; }
        }

        /// <summary>
        /// 指定的文字段落源言語,為空時,進行言語的自動檢測,在Translate完成後把檢測到言語編號記錄到這裡
        /// </summary>
        public string SourceLanguageCode { get; set; }

        /// <summary>
        /// 目的語言編碼
        /// </summary>
        public string TargetLanguageCode { get; set; }

        /// <summary>
        /// Google Translate API 成功翻譯後, 返回的結果(翻譯成目的語言的文字段落)
        /// 當前屬性會映射到Database
        /// </summary>
        public string TranslateText { get; set; }
        /// <summary>
        /// Google Translate API 在進行Translate的過程,未能正常運行,返回的錯誤資訊
        /// 當前屬性會映射到Database
        /// </summary>
        public string TranslateErrorMessage { get; set; }
        /// <summary>
        /// 對應的Target Database 別名
        /// 當前屬性會映射到Database
        /// </summary>
        public string DbAlias { get; set; }
        /// <summary>
        /// Target Database 的資料庫連接串, 這個是創建Task時把DatabaseInfo的資訊複製過來, 
        /// 使DbExecTask是一個可以獨立資料物件,不會受到DatabaseInfo的更新而有所變化
        /// </summary>
        public string DbConnectionString { get; set; }
        /// <summary>
        /// Task 創建的時間
        /// 當前屬性會映射到Database
        /// </summary>
        public DateTime CreateDate { get; set; }
        /// <summary>
        /// Task 成功執行完成的時間, 當Task無法成功執行時, FinishDate就為空
        /// 當前屬性會映射到Database
        /// </summary>
        public DateTime? FinishDate { get; set; }
        /// <summary>
        /// 向Google Translate API 發出請求的超時時間, 單位是毫秒(MS)
        /// </summary>
        public int TranslateTimeout { get; set; }
        /// <summary>
        /// 向 Target Database 執行Sql Script的超時時間, 單位是毫秒(MS)
        /// 如果Timeout的時間設置得比較長,那就不能在Web Service上進行, 只能在 Winform Application 監聽下,運行
        /// 當前屬性會映射到Database
        /// </summary>
        public int DbExecSqlTimeout { get; set; }
        /// <summary>
        /// Task 執行的優先順序, 同一個級別, 就以CreateDate 較小的先執行
        /// 當前屬性會映射到Database
        /// </summary>
        public int Priority { get; set; }
        /// <summary>
        /// 可以嘗試執行Task的次數上限
        /// 只有Task在執行不成功的情況下, 才會反復嘗試執行
        /// 當前屬性會映射到Database
        /// </summary>
        public int RunTimesLimit { get; set; }
        /// <summary>
        /// 當前Task所執行過的次數
        /// 如果1次就成功完成,那這個值只會是1,RunTimesAmout 不大於 RunTimesLimit,當它們相等時,當前Task就不會再嘗試執行.
        /// 當前屬性會映射到Database
        /// </summary>
        public int RunTimesAmount { get; set; }
        /// <summary>
        /// 當Task在進行Sql Script的執行時,出現的錯誤描述
        /// 當出現執行異常的情況,我們就無需要再進行多次的嘗試執行
        /// 當前屬性會映射到Database
        /// </summary>
        public string ExecSqlErrorMessage { get; set; }

        /// <summary>
        /// Task執行時,遇到的異常,並把Exception.Message記錄下來
        /// 當前屬性會映射到Database
        /// </summary>
        public string ExceptionMessage { get; set; }

        /// <summary>
        /// 需要執行的存儲過程名稱
        /// 在這個WebService沒有必要加入 Db update 有業務邏輯,具體的業務邏輯由 Target Database 自己定義存儲過程來完成
        /// 當前屬性會映射到Database
        /// </summary>
        public string ProcedureName { get; set; }
        /// <summary>
        /// 需要執行的存儲過程參數
        /// 多個參數以指定的分隔符號進行劃分
        /// 當前屬性會映射到Database
        /// </summary>
        public string ProcedureParmasString { get; set; }

        /// <summary>
        /// Target Database 所在地區,所用的時區信息
        /// 範圍是-12到+12之間
        /// 當前屬性會映射到Database
        /// </summary>
        public int TimeZoneValue { get; set; }
        /// <summary>
        /// 可以執行時間範圍的起始值,如果為空,就為看作00:00:00
        /// 格式為HH:mm:ss
        /// 當前屬性會映射到Database
        /// </summary>
        public string RunableStartTimeString { get; set; }
        /// <summary>
        /// 可以執行時間,如果為空,就為看作23:59:59
        /// 格式為HH:mm:ss
        /// 如果RunableStartTimeString與RunableEndTimeString都為空,那就等同於"00:00:00 - 23:59:59"全天有效
        /// 當前屬性會映射到Database
        /// </summary>
        public string RunableEndTimeString { get; set; }


        /// <summary>
        /// 是否在創建時就執行第一次
        /// </summary>
        public bool IsImmediatelyRunFirstTime { get; set; }

        /// <summary>
        /// Task是否已經完成的Translate環節
        /// </summary>
        public bool IsTranslated
        {
            get { return string.IsNullOrEmpty(TranslateErrorMessage); }
        }

        /// <summary>
        /// 檢測Task是否已經成功執行
        /// </summary>
        /// <returns></returns>
        public bool CheckIsCompleted()
        {
            return FinishDate.HasValue; 
        }

        /// <summary>
        /// 獲取Task最後一次執行後,的錯誤資訊,為空代成功執行
        /// ErrorMessage是預期的錯誤,不是異常
        /// </summary>
        /// <returns></returns>
        public string GetFinalErrorMessage()
        {
            return TranslateErrorMessage + ExecSqlErrorMessage; 
        }

        /// <summary>
        /// 檢驗當前系統的時間是否允許執行Task
        /// </summary>
        /// <returns></returns>
        private bool CheckIsInRunableTime()
        {

            return false;
        }

        /// <summary>
        /// 檢驗Task是否需要執行
        /// </summary>
        /// <returns></returns>
        public bool CheckIsNeedToRun()
        {
            if(!((RunTimesAmount==0 && IsImmediatelyRunFirstTime) || FinishDate.HasValue 
                || (!string.IsNullOrEmpty(ExceptionMessage)) || RunTimesAmount>=RunTimesLimit))
            {
                if(CheckIsInRunableTime())
                {
                    return true;
                }
            }
            return false;
        }
    }
}
